package project02.controller.dataModify;

import java.util.Calendar;
import java.util.logging.Logger;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.util.BeanUtil;

import project02.cool.Consts;
import project02.cool.CustomValidator;
import project02.cool.Util;
import project02.dao.DateDataDao;
import project02.model.DataModifyBean;
import project02.model.DateData;
import project02.model.UserInfo;

public class ModifyController extends Controller {

    @SuppressWarnings("unused")
    private static final Logger logger = Logger.getLogger(ModifyController.class.getName());

    private DateDataDao dao = new DateDataDao();
    private Util util = Util.getInstance();


    @Override
    public Navigation run() {

        UserInfo user = sessionScope("userInfo");

        if (!Validate()) {
            returnFrontPage();
            return forward("index.jsp");
        }

        if (!user.getPassword().equals(asString("userPass"))) {
            returnFrontPage();
            requestScope("result", "パスワードが一致しません.");
            return forward("index.jsp");
        }

        Calendar calGtw = Calendar.getInstance();
        Calendar calGh = Calendar.getInstance();
        calGtw.set(Integer.parseInt(asString("startYear")), Integer.parseInt(asString("startMonth")) - 1, Integer.parseInt(asString("startDate")), Integer.parseInt(asString("startHour")), Integer.parseInt(asString("startMinuts")));
        calGh.set(Integer.parseInt(asString("endYear")), Integer.parseInt(asString("endMonth")) - 1, Integer.parseInt(asString("endDate")), Integer.parseInt(asString("endHour")), Integer.parseInt(asString("endMinuts")));

        String chkResult = util.chkTargetOfModify(calGtw, calGh, asString("dataId"));

        DateData entity = new DateData();
        entity.setDataId(asString("dataId"));
        entity.setUserId(user.getUserId());
        entity.setYear(asString("year"));
        entity.setMonth(asString("month"));
        entity.setDate(asString("date"));
        entity.setGoToWork(calGtw.getTime());
        if (Consts.noChange.equals(chkResult) || Consts.ghOnly.equals(chkResult)) {
            entity.setGtwFlg(Consts.original);
        } else {
            entity.setGtwFlg(Consts.revision);
        }
        entity.setGoHome(calGh.getTime());
        if (Consts.noChange.equals(chkResult) || Consts.gtwOnly.equals(chkResult)) {
            entity.setGhFlg(Consts.original);
        } else {
            entity.setGhFlg(Consts.revision);
        }

        try {
            dao.makePersistentInTx(entity);
        } catch (Exception e) {
            requestScope("result", "修正に失敗しました。" + e.getMessage());
            return forward("modify.jsp");
        }

        requestScope("result", "修正しました.");


        return forward("modify.jsp");
    }

    /**
     * バリデータ
     * @return バリデータ
     */
    private boolean Validate() {

        CustomValidator val = new CustomValidator(request);
        val.add("userPass", val.required("入力必須項目です."));
        val.add("startYear", val.required("年は入力必須項目です."), val.integerType("年は数字を入力してください."), val.equalIntegerValue(asInteger("year"), "修正データ年月日と出勤年月日は同一日にしてください."));
        val.add("startMonth", val.required("月は入力必須項目です."), val.integerType("月は数字を入力してください."), val.equalIntegerValue(asInteger("month"), "修正データ年月日と出勤年月日は同一日にしてください."));
        val.add("startDate", val.required("日は入力必須項目です."), val.integerType("日は数字を入力してください."), val.equalIntegerValue(asInteger("date"), "修正データ年月日と出勤年月日は同一日にしてください."));
        val.add("startHour", val.required("時は入力必須項目です."), val.integerType("時は数字を入力してください."));
        val.add("startMinuts", val.required("分は入力必須項目です."), val.integerType("分は数字を入力してください."));
        val.add("endYear", val.required("年は入力必須項目です."), val.integerType("年は数字を入力してください."));
        val.add("endMonth", val.required("月は入力必須項目です."), val.integerType("月は数字を入力してください."));
        val.add("endDate", val.required("日は入力必須項目です."), val.integerType("日は数字を入力してください."));
        val.add("endHour", val.required("時は入力必須項目です."), val.integerType("時は数字を入力してください."));
        val.add("endMinuts", val.required("分は入力必須項目です."), val.integerType("分は数字を入力してください."));

        return val.validate();
    }


    /**
     * 前画面の入力内容をリクエストパラメータに入れる(バリデータで前画面に戻る対応)
     */
    public void returnFrontPage() {

        DataModifyBean bean = new DataModifyBean();
        BeanUtil.copy(request, bean);
        requestScope("resultData", bean);
    }
}
